#爬取数据，链家网大连金州区二手房，但是爬到的数据好多重复的

import asyncio
import aiohttp   #原生协程提高爬取速率
import parsel
import pymongo

client=pymongo.MongoClient('localhost',27017)
db=client['house']  #数据库名字
urls=[]
for a in range(1,101):
    url = "https://dl.lianjia.com/ershoufang/jinzhou/?sug=%E9%87%91%E5%B7%9E".format(a)
    urls.append(url)
async def get_page(url):
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.183 Safari/537.36"}
    async with aiohttp.ClientSession() as session:
        async with await session.get(url, headers=headers) as d:  #因为异步爬虫遇到同步操作会停止所以这里没有用requset.get()方法,这里还有一个挂起操作。
            v = await d.text()
            c = parsel.Selector(v) #创建parsel.Selector对象,用于css选择器解析
            p = c.css(".clear.LOGCLICKDATA")
            for i in p:
                标题 = i.css(".title a::text").get().replace(" ", "-")
                地址 = "-".join(i.css(".positionInfo a::text").getall())
                房源信息 = i.css(".houseInfo ::text").get().split("|")
                房间数 = 房源信息[0]
                面积 =float(房源信息[1].replace("平米",""))
                朝向 = 房源信息[2].strip()
                装修方式 = 房源信息[3].strip()
                楼层 = 房源信息[4].strip()
                楼型 = 房源信息[-1].strip()
                单价 = str(i.css(".unitPrice ::text").get().replace("单价", "").replace("元/平方米", ""))
                #单价 = int(i.css(".unitPrice ::text").get().replace("单价", "").replace("元/平方米", ""))
                总价 = str(i.css(".totalPrice ::text").get())
                print("正在爬取",标题)
                result = {
                    'zl_标题': 标题,
                    'zl_地址': 地址,
                    'zl_房源信息': {
                        'zl_房间数': 房间数,
                        'zl_面积(平方米)': 面积,
                        'zl_朝向': 朝向,                        #封装成字典形式方便插入操作
                        'zl_装修方式': 装修方式,
                        'zl_楼层': 楼层,
                        'zl_楼型': 楼型
                    },
                    'zl_单价(元/平米)': 单价,
                    'zl_总价(万元)': 总价
                }
                #print(result)
                db['house'].insert(result)
tasks=[]
for url in urls:
    c=get_page(url)
    task=asyncio.ensure_future(c)
    tasks.append(task)  #把多个task任务放在列表里方便协程操作
loop=asyncio.get_event_loop()
loop.run_until_complete(asyncio.wait(tasks))
loop.close()